package com.qf.p1.result;


import com.alibaba.fastjson.JSONObject;

import java.util.Map;

/**
 * 封装rest api 返回结果
 * 这个类是通用的
 * 这个类需要支持链式编程
 * 这个类应该避免魔法值的使用
 * 魔法值：即未经预先定义的常量
 * @author xuzhong
 */
public class R {
    private int code;
    private String msg;
    private Object result;
    public static final int OK_200=200;
    public static final String OK_MSG="请求成功";
    public static final int E_500=500;
    public static final String E_MSG="请求失败";
    private static final int IS_OK=100;

    /**
     * 无字段式响应结果
     * 只要满足编程规范，即便不存在ok字段
     * 最后转化为json也有一个boolean类型来判断请求的ok字段是否为true
     * 好处是，前端那高json可以直接 if(r.code==200||r.code==201……)
     * @return
     */
    public boolean isOk(){
        if(this.code/IS_OK==2){
            return true;
        }
        return false;
    }

    public R setCode(int code) {
        this.code = code;
        return this;
    }

    public R setMsg(String msg) {
        this.msg = msg;
        return this;
    }

    public R setResult(Object result) {
        this.result = result;
        return this;
    }
    public R setResult(String key,Object value){
        if(result==null){
            JSONObject result=new JSONObject();
            result.put(key,value);
            this.result=result;
        }else{
            if(result instanceof JSONObject){
                ((JSONObject)result).put(key,value);
            }
            if(result instanceof Map){
                ((Map)result).put(key,value);
            }
        }
        return this;
    }


    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public Object getResult() {
        return result;
    }

    /**
     * 封装调用成功的方法
     *
     */
    public static R ok(){
        R r=new R().setCode(OK_200).setMsg(OK_MSG);
        return r;
    }
    public static R ok(int code){
        R r=ok().setCode(code);
        return r;
    }
    public static R ok(String msg){
        R r=ok().setMsg(msg);
        return r;
    }
    public static R ok(Object data){
        return ok().setResult(data);
    }
    public static R ok(int code,String msg){
        R r=ok().setCode(code).setMsg(msg);
        return r;
    }
    /**
     * 调用失败的方法
     */
    public static R error(){
        R r=new R().setCode(E_500).setMsg(E_MSG);
        return r;
    }
    public static R error(int code){
        return R.error().setCode(code);
    }
    public static R error(String msg){
        return R.error().setMsg(msg);
    }
    public static R error(Object data){
        return error().setResult(data);
    }
    public static R error(int code,String msg){
        return R.error().setCode(code).setMsg(msg);
    }



    public String toJsonString(R r){
        return JSONObject.toJSONString(r);
    }

    @Override
    public String toString() {
        return toJsonString(this);
    }
}
